[アップデート] API Gateway HTTP API で AWS サービス統合が利用可能になりました
本日のアップデートで API Gateway HTTP API で AWS サービス統合が利用できるようになりました。
何が嬉しいのか
これまで HTTP API では AWS サービス統合はサポートされておらず、バックエンドの AWS サービスを利用したい場合は Lambda またはコンテナなど何らかの HTTP バックエンドにリクエストをルーティングし、そこから AWS サービスエンドポイントにアクセスする必要がありました。
今回のアップデートにより、このようなプロキシを利用せずとも HTTP API から直接 AWS サービスへのリクエストが可能となりました。
REST API では既に利用できる機能でしたので、HTTP API への置き換えることが出来ない要因の 1 つであったかと思いますが、これでまた 1 つ障壁が取り除かれましたね。
対応サービス
とはいえ、今回のアップデートでサポートされるサービスは以下の 5 つです。対応しているアクションについてもあわせてご確認ください。
- EventBridge
- イベントの送信
- SQS
- メッセージの送信、受信、削除
- AppConfig
- AppConfig 構成の取得
- Kinesis Data Streams
- データストリームへ送信
- StepFunctions
- ステートマシンの開始、停止
まだまだ REST API に比べると数が少ないですが、今後の追加サポートに期待しましょう。
やってみる
今回は SQS との統合で確認します。
事前準備
以下のリソースは事前に作成しておきます。
- SQS
- IAM ロール
IAM ロールは HTTP API の Invocation role
で指定するものです。以下のように apigateway.amazonaws.com
を信頼ポリシーに持つ IAM ロールを作成し、今回は AmazonSQSFullAccess
ポリシーをアタッチしておきました。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
HTTP API の作成
API Gateway の管理コンソールより、HTTP API を作成します。API 作成時には AWS Service
の指定は出来ないようですので、まずは選択可能な HTTP
か Lambda
統合をダミーで選択して作成しました。
ルートは /sqs/message
として作成しました。
[開発] - [統合] を開き、先程作成したルートから 統合を作成してアタッチ
をクリックします。
統合ターゲットから対象となる AWS サービスを選択します。今回は SQS を指定。
SQS の場合、Integration action
には以下の 4 つが指定可能です。
- SQS-SendMessage
- SQS-ReceiveMessage
- SQS-DeleteMessage
- SQS-PurgeQueue
今回は SendMessage
を指定します。
Integration action
に必要なパラメータをリクエストからマッピングする設定を行います。SQS-SendMessage の場合、必須パラメータは QueueUrl
と MessageBody
です。(今回は必須パラメータ以外は一旦無視しますが、実際の運用では必要に応じて他のパラメータも含めてください)
以下の例では SQS の MessageBody
にマッピングするため $request.body.message
を指定しています。.message
は JSON パスです。今回 SQS の URL は固有のものを埋め込んでいますが $request.header.queueUrl
のように定義してヘッダー指定で渡すことで柔軟に SQS を振り分けることも出来ます。
リクエストパラメータのマッピングおよび 各 Integration action
の必須パラメータは公式ガイドを参照ください。
同樣に GET
メソッドに ReceiveMessage
の統合を作成
DELETE
メソッドに DeleteMessage
の統合を作成しました。
HTTP API の自動デプロイを有効にしているので、設定の都度デプロイする必要はありません。自動デプロイ最高ですね。
動作確認
それでは動作を確認していきましょう。
SendMessage
今回、MessageBody
には $request.body.message
として送るように定義しましたので -d '{"message":"Classmethod"}'
のように JSON パスを付与してメッセージを送ります。
$ curl -X POST https://cumh24a5d8.execute-api.ap-northeast-1.amazonaws.com/sqs/message \ -d '{"message":"Classmethod"}' <?xml version="1.0"?> <SendMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"> <SendMessageResult> <MessageId>2694375c-f8db-4497-87b1-ac9bc4a336ad</MessageId> <MD5OfMessageBody>1621732e43dd55bda452f7e5fd4ce368</MD5OfMessageBody> </SendMessageResult> <ResponseMetadata> <RequestId>87716c1c-e87e-57a9-a628-3ba5bc4dd496</RequestId> </ResponseMetadata> </SendMessageResponse>
SQS のコンソールを確認するとメッセージが 1
になっているので、送信できていますね。
ReceiveMessage
次に、先程送ったメッセージを受信します。
$ curl -X GET https://cumh24a5d8.execute-api.ap-northeast-1.amazonaws.com/sqs/message <?xml version="1.0"?> <ReceiveMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"> <ReceiveMessageResult> <Message> <MessageId>2694375c-f8db-4497-87b1-ac9bc4a336ad</MessageId> <ReceiptHandle>AQEBm0Uin31YesF2XdHgyD6oVTNdGfqr8VXV4/3XWn5QK5eA0PsQb0APl3caXbh6W56HLlxnWe/C9ITaNBWvRoezuFjcVr11cYk0K05N/YeZbqxzY5f6qpg+1qdReyjpH19CUwok1qFaN7LEF12jhl1t8YIhuMrFeYt8qw4w9nwT1Gvv75pB1VduIBzanErS68ne2blBpklZg9lLD7pjUbwbLY7AcCpO0HHYIH6sTzlUkovYxxIxRxo9Yf/NvUZM1nVLG8gLFLPDykpmr9rXLqoDoo+HF+z6TshJLGLWFuTvDCs4A2coD09yt2PvSQx1CS6S3yntkJ4hR2I0lGDAHqXh4JAejkAIVXk51cAvt0cTcit2DLOzxVynJ5APk6bIJUxwNnz0Lsr8Wk9zMorTNpamfg==</ReceiptHandle> <MD5OfBody>1621732e43dd55bda452f7e5fd4ce368</MD5OfBody> <Body>Classmethod</Body> </Message> </ReceiveMessageResult> <ResponseMetadata> <RequestId>becdcf7f-9241-5aac-a175-98c6c60dbde0</RequestId> </ResponseMetadata> </ReceiveMessageResponse>
送信したメッセージ Classmethod
を正常に受信できました。
DeleteMessage
最後にキューのメッセージを削除します。キューの削除に必要な ReceiptHandle
は $request.body.receipthandle
として送るように定義しています。値は先程受信したメッセージ内の ReceiptHandle
の値を指定します。
$ curl -X DELETE https://cumh24a5d8.execute-api.ap-northeast-1.amazonaws.com/sqs/message \ -d '{"receipthandle":"AQEBm0Uin31YesF2XdHgyD6oVTNdGfqr8VXV4/3XWn5QK5eA0PsQb0APl3caXbh6W56HLlxnWe/C9ITaNBWvRoezuFjcVr11cYk0K05N/YeZbqxzY5f6qpg+1qdReyjpH19CUwok1qFaN7LEF12jhl1t8YIhuMrFeYt8qw4w9nwT1Gvv75pB1VduIBzanErS68ne2blBpklZg9lLD7pjUbwbLY7AcCpO0HHYIH6sTzlUkovYxxIxRxo9Yf/NvUZM1nVLG8gLFLPDykpmr9rXLqoDoo+HF+z6TshJLGLWFuTvDCs4A2coD09yt2PvSQx1CS6S3yntkJ4hR2I0lGDAHqXh4JAejkAIVXk51cAvt0cTcit2DLOzxVynJ5APk6bIJUxwNnz0Lsr8Wk9zMorTNpamfg=="}' <?xml version="1.0"?> <DeleteMessageResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/"> <ResponseMetadata> <RequestId>9a1f49f7-3638-5e58-a7f0-1e4e6290e0db</RequestId> </ResponseMetadata> </DeleteMessageResponse>
AWS コンソールから確認すると先程は 1
でしたが 0
に変わっていますので、正常に削除まで完了できていますね。
検証は以上です。
さいごに
HTTP API はシンプルに構成ができ、パフォーマンスも早く、コストも安くて良いですね。これまで HTTP API に置き換え検討する際に、AWS サービス統合が利用できないことでボトルネックになっていた環境もあるかと思います。
今回のアップデートでは、ひとまず 5 つのサービスだけですがコレを皮切りに他の AWS サービス統合の追加サポートが増えてくるのであれば、ますます REST API から HTTP API への置き換えのハードルが下がりそうですね。今後も HTTP API から目が離せません!
SQS 以外のやってみた記事もいずれあがってくることでしょう!
以上!大阪オフィスの丸毛(@marumo1981)でした!